package com.ltg.file.fastdfs.conf;

import lombok.Getter;
import lombok.Setter;
import org.csource.fastdfs.ClientGlobal;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

/**
 * <p> ClassName: FastDFSProperties </p>
 * <p> Package: com.ltg.file.fastdfs.conf </p>
 * <p> Description: </p>
 * <p></p>
 *
 * @Author: LTG
 * @Create: 2023/5/21 - 11:28
 * @Version: v1.0
 */

@Getter
@Setter
@ConfigurationProperties(prefix = "file.fastdfs")
@Component
public class FastDFSProperties {
    /**
     * FastDFS外部访问地址，例如：https://file.example.com
     */
    private String endpoint;

    /**
     * 连接超时时间，针对socket套接字函数connect，单位秒
     */
    private int connectTimeout = 5;

    /**
     * tracker server的网络超时，单位为秒。发送或接收数据时，如果在超时时间后还不能发送或接收数据，则本次网络通信失败。
     */
    private int networkTimeout = 30;

    /**
     * 编码
     */
    private String charset = "UTF-8";

    /**
     * SecretKey
     */
    private String secretKey = ClientGlobal.DEFAULT_HTTP_SECRET_KEY;

    /**
     * Tracker 配置
     */
    private Tracker tracker = new Tracker();

    /**
     * Storage 配置
     */
    private Storage storage = new Storage();

    /**
     * 连接池管理
     */
    private ConnectionPool connectionPool = new ConnectionPool();

    @Getter
    @Setter
    public static class Tracker {
        /**
         * Tracker 端口号
         */
        private int httpPort = ClientGlobal.DEFAULT_HTTP_TRACKER_HTTP_PORT;

        /**
         * Tracker 服务器
         */
        private List<String> servers = new ArrayList<String>();
    }

    @Getter
    @Setter
    public static class Storage {
        /**
         * Storage 服务默认端口号
         */
        private int port = 23000;

        /**
         * Storage 服务器
         */
        private List<String> servers = new ArrayList<String>();
    }

    @Getter
    @Setter
    public static class ConnectionPool {
        /**
         * 是否启用连接池
         */
        private boolean enabled = false;

        /**
         * 最大连接数
         */
        private int maximumPoolSize = 10;

        /**
         * 最大空闲时间
         */
        private int maxIdleTime = 3600;

        /**
         * 最大等待时间
         */
        private int maxWaitTimeInMs = 1000;
    }
}
